<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>StrPtr - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The StrPtr function returns the current memory address of a string." />
<meta name="ahk:equiv-v1" content="Variables.htm#amp" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
</head>
<body>

<h1>StrPtr</h1>
<p>返回字符串的当前内存地址.</p>
<pre class="Syntax">Address := <span class="func">StrPtr</span>(Value)</pre>

<h2 id="Parameters">参数</h2>
<dl>

  <dt>Value</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
  </dd>

</dl>

<h2 id="Return_Value">返回值</h2>
<p>类型: <a href="../Concepts.htm#numbers">整数</a></p>
<p>该函数返回 <em>Value</em> 的当前内存地址.</p>

<h2 id="Remarks">备注</h2>
<p>一个地址的寿命以及对它进行哪些操作是有效的, 取决于 <em>Value</em> 是如何传递给这个函数的. 有三种不同的情况, 如下面的示例代码所示. 在所有情况下, 如果字符串 <strong>不会</strong> 被修改, 返回值可以 <em>直接</em> 传递给 <a href="DllCall.htm">DllCall</a> 函数或 <a href="SendMessage.htm">SendMessage</a>.</p>
<pre>Ptr := StrPtr(MyVar)</pre>
<p>如果 <em>Value</em> 是一个<a href="../Concepts.htm#variable-references">变量引用</a>(如 <code>MyVar</code>)(而不是内置变量), 那么返回值就是变量内部字符串缓冲的内存地址. <code><a href="VarSetStrCapacity.htm">VarSetStrCapacity</a>(&amp;MyVar)</code> <strong>以字符为单位</strong> 返回缓冲的大小, 不包括终止的空字符.</p>
<p>这个地址应该被认为是有效的, 直到变量被释放或被重新赋值(通过<a href="../Variables.htm#AssignOp">赋值运算符</a>或将其传递给内置函数). 在函数返回后, 函数的<a href="../Functions.htm#Local">局部</a>变量的内容地址是无效的, 因为局部变量是自动释放的.</p>
<p>该地址可以存储在 <a href="DllCall.htm#struct">structure(结构体)</a> 或其他变量中, 并间接传递给 <a href="DllCall.htm">DllCall</a> 或 <a href="SendMessage.htm">SendMessage</a> 或以其他方式使用, 只要它仍然有效, 如上所述.</p>
<p>脚本可以通过将地址间接传递给 <a href="NumPut.htm">NumPut</a>, <a href="DllCall.htm">DllCall</a> 或 <a href="SendMessage.htm">SendMessage</a> 来改变字符串的值. 如果以这种方式改变了字符串的长度, 必须通过调用 <code><a href="VarSetStrCapacity.htm">VarSetStrCapacity</a>(MyVar, -1)</code> 来更新变量的内部长度属性.</p>
<pre>Ptr := StrPtr("literal string")</pre>
<p>原义字符串的地址是有效的, 直到程序退出. 脚本不应试图修改该字符串. 该地址可以存储在<a href="DllCall.htm#struct">结构体</a>或其他变量中, 并间接传递给 <a href="DllCall.htm">DllCall</a> 或 <a href="SendMessage.htm">SendMessage</a> 或以其他方式使用.</p>
<pre>SendMessage 0x000C, 0, StrPtr(A_ScriptName " changed this title"),, "A"</pre>
<p>临时字符串的地址只在整体表达式的计算或函数调用语句完成之前有效, 之后不得使用. 对于上面的例子, 地址在 SendMessage 返回之前都是有效的. 以下所有内容都会产生临时字符串:</p>
<ul>
  <li>连接.</li>
  <li>内置变量, 如 <a href="../Variables.htm#ScriptName">A_ScriptName</a>.</li>
  <li>返回字符串的函数.</li>
  <li>访问对象的属性, 数组元素或映射元素.</li>
</ul>
<p>如果上面没有明确说明, 可以安全的假定字符串是临时的.</p>

<h2 id="Related">相关</h2>
<p><a href="VarSetStrCapacity.htm">VarSetStrCapacity</a>, <a href="DllCall.htm">DllCall</a>, <a href="SendMessage.htm">SendMessage</a>, <a href="Buffer.htm">Buffer 对象</a>, <a href="NumPut.htm">NumPut</a>, <a href="NumGet.htm">NumGet</a></p>

</body>
</html>